package com.ztgf.pay.service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.trz.netwk.api.system.TrdMessenger;
import com.trz.netwk.api.trd.*;
import com.trz.netwk.api.vo.FrzeInfo;
import com.trz.netwk.api.vo.FrzeRsut;
import com.ztgf.common.constant.Result;
import com.ztgf.common.enums.CodeEnum;
import com.ztgf.common.utils.BigDecimalUtils;
import com.ztgf.common.utils.DateUtils;
import com.ztgf.common.utils.StrUtils;
import com.ztgf.pay.async.IAsyncService;
import com.ztgf.pay.models.bo.PayUserMoneySaveBO;
import com.ztgf.pay.models.bo.PayUserWithdrawBO;
import com.ztgf.pay.models.dto.PayHttpLogDTO;
import com.ztgf.pay.models.dto.PayUserDTO;
import com.ztgf.pay.models.service.IPayHttpLogService;
import com.ztgf.pay.models.service.IPayUserService;
import com.ztgf.pay.models.vo.PayUserBalanceVO;
import com.ztgf.pay.models.vo.PayUserMoneyVO;
import com.ztgf.shopping.models.bo.shop.ShopEarnestMoneyReturnBO;
import com.ztgf.shopping.models.service.shop.IShopEarnestMoneyService;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import javax.annotation.Resource;
import com.ztgf.pay.common.config.YmlConfig;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.ztgf.pay.mapper.PayUserRechargeMapper;
import com.ztgf.pay.models.service.IPayUserRechargeService;
import com.ztgf.pay.models.bo.PayUserRechargeSaveBO;
import com.ztgf.pay.models.dto.PayUserRechargeDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import java.math.BigDecimal;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 用户充值表控制器
 *
 * @author mxli
 * @Date 2020-07-30 12:15:08
 */
@DubboService
@Slf4j
public class PayUserRechargeServiceImpl extends ServiceImpl<PayUserRechargeMapper, PayUserRechargeDTO> implements IPayUserRechargeService{

    @Resource
    private YmlConfig ymlConfig;

    @Autowired
    private IPayUserService payUserService;

    @Autowired
    private IPayHttpLogService httpLogService;

    @Autowired
    private IAsyncService asyncService;


    @Value("${zj-pay.page-pay-url-wallet}")
    private String pageWalletUrl; //我的钱包
    @Value("${zj-pay.page-pay-url-margin}")
    private String pageMarginUrl; //保证金
    @Value("${zj-pay.page-pay-url-annual-fee}")
    private String pageAnnualFeeUrl; //年费
    @Value("${zj-pay.page-pay-url-order}")
    private String pageOrderUrl; //订单支付成功
    @Value("${zj-pay.notice-url}")
    private String noticeUrl;//后台地址

    /**
     * 网银充值
     * @param saveBO
     * @return
     */
    @Override
    public Result<PayUserRechargeDTO> saveRechargeByOnlineBank(PayUserRechargeSaveBO saveBO) {
        if(saveBO.getUserId() == null || saveBO.getMoney() == null || saveBO.getMoney().doubleValue() <= 0){
            return new Result(CodeEnum.FAIL_100002);
        }
        PayUserDTO dto = payUserService.getPayUserDTO(saveBO.getUserId());
        if(dto == null){
            return new Result(CodeEnum.FAIL_200003);
        }

        //调用余额接口
        //添加请求日志
        PayHttpLogDTO logDTO = new PayHttpLogDTO();
        boolean httpSuccess = false;
        //添加记录
        PayUserRechargeDTO rechargeDTO = new PayUserRechargeDTO();
        Long id = ymlConfig.getPkId();
        rechargeDTO.setId(id);
        rechargeDTO.setUserId(saveBO.getUserId());
        rechargeDTO.setMoney(saveBO.getMoney());
        rechargeDTO.setStatus(0);
        rechargeDTO.setBusinessId(saveBO.getBusinessId());

        String msg = CodeEnum.FAIL_200018.getMsg();
        try {

            // 2. 实例化交易对象
            TrdT2031Request trdRequest = new TrdT2031Request();
            trdRequest.setMsghd_trdt(DateUtils.dateToStr(new Date(),DateUtils.DATE_FORMAT_DATESHORTDAY));/** 交易日期 */
            trdRequest.setSrl_ptnsrl(id.toString());/** 合作方交易流水号 */
            trdRequest.setCltacc_subno(dto.getZjMoneyNo());/** 资金账号 */
            trdRequest.setCltacc_cltnm(dto.getZjAccountName()); /** 户名 */

            trdRequest.setBillinfo_aclamt(BigDecimalUtils.multiply(saveBO.getMoney(), 100).longValue()+""); /** 支付金额 */
            trdRequest.setBillinfo_bankid(saveBO.getBankId());/** 付款银行编号:PayType=2时必输 */
//            trdRequest.setBillinfo_kjbndsrl(billinfo_kjbndsrl);/** 原快捷绑卡交易流水号-PayType=5时必输-可通过T4001交易完成绑卡操作 */
//            trdRequest.setBillinfo_kjsmsflg(billinfo_kjsmsflg);/** 快捷业务是否需要短信确认-1：需要；2：不需要-PayType=5时必输 */
//            trdRequest.setBillinfo_subject(billinfo_subject);/** 订单标题:PayType=6/8/A时必输 */
            trdRequest.setBillinfo_ccycd("CNY");
//            trdRequest.setBillinfo_goodsdesc(billinfo_goodsdesc);/** 商品描述:PayType=6/8/A时必输 */
            trdRequest.setBillinfo_paytype("2");/** 支付方式：2：网银;5：快捷支付;6：正扫支付;8：公众号支付;9：银联无卡支付;A：手机APP跳转支付 */
            trdRequest.setBillinfo_secpaytype("1");/** 支付方式-二级分类(1：企业网银PayType=2必输;2：个人网银PayType=2必输;3：支付宝PayType=6/8/A必输;4：微信PayType=6/8/A必输；5：银联PayType=6必输) */
            trdRequest.setBillinfo_limitpay("0"); /** 卡类型限制 secpaytype=3/4时 值为 0=不限定、10=仅支持借记卡、20=仅支持贷记卡、空值，非必填*/
//            trdRequest.setBillinfo_userid(billinfo_userid);/** 用户ID:PayType=8时必输,微信：openid;支付宝：buyer_user_id */
//            trdRequest.setBillinfo_minitag(billinfo_minitag);/** 是否小程序支付 0 不是 1 是 */
//            trdRequest.setBillinfo_payeefee(billinfo_payeefee); //支付手续费
//            trdRequest.setBillinfo_appid(billinfo_appid);//微信小程序、公众号 APPID


            trdRequest.setServnoticurl(noticeUrl); /** 后台通知URL-若不传值则默认按照后台配置的地址进行通知交易结果 */
            trdRequest.setReqflg("1"); /** 发送端标记:0手机;1PC端 */
            rechargeDTO.setPayType(1);
//            if(saveBO.getType() == 2){
//                String usage = StrUtils.isEmpty(saveBO.getUsage()) ? "缴保证金" : saveBO.getUsage();
//                trdRequest.setUsage(usage);/** 资金用途(附言) */
//                trdRequest.setTrsflag("B00");/** 业务标示:A00普通收款;B00收款方收款成功后，再冻结资金 */
//                rechargeDTO.setNotifyUrl("1");
//                trdRequest.setNotificationurl(pageMarginUrl);/** 页面通知URL */
//            } else if(saveBO.getType() == 0){
                String usage = StrUtils.isEmpty(saveBO.getUsage()) ? "充值" : saveBO.getUsage();
                trdRequest.setUsage(usage + id);/** 资金用途(附言) */
                trdRequest.setTrsflag("A00");/** 业务标示:A00普通收款;B00收款方收款成功后，再冻结资金 */
//                trdRequest.setNotificationurl(pageWalletUrl);/** 页面通知URL */
                trdRequest.setNotificationurl(saveBO.getNotificationurl());/** 页面通知URL */
//            } else {
//                return new Result(CodeEnum.FAIL_100002);
//            }

//            trdRequest.setDremark1(dremark1);/** 合作方自定义备注1 */
//            trdRequest.setDremark2(dremark2);/** 合作方自定义备注2 */
//            trdRequest.setDremark3(dremark3);/** 合作方自定义备注3 */
//            trdRequest.setDremark4(dremark4);/** 合作方自定义备注4 */
//            trdRequest.setDremark5(dremark5);/** 合作方自定义备注5 */
//            trdRequest.setDremark6(dremark6);/** 合作方自定义备注6 */

//            trdRequest.setMerchantid(merchantid); /** 终端商户号 */


            // 3. 报文处理
            trdRequest.process();
            System.out.println("请求报文[" + trdRequest.getRequestPlainText() + "]");
            System.out.println("签名原文[" + trdRequest.getRequestMessage() + "]");
            System.out.println("签名数据[" + trdRequest.getRequestSignature() + "]");
            logDTO.setParams(trdRequest.getRequestPlainText());
            logDTO.setWaterId(id);

            // 4. 与融资平台通信
            TrdMessenger trdMessenger = new TrdMessenger();
            // message
            String respMsg = trdMessenger.send(trdRequest);

            // 5. 处理交易结果
            TrdT2031Response trdResponse = new TrdT2031Response(respMsg);
            System.out.println("响应报文[" + trdResponse.getResponsePlainText() + "]");
            logDTO.setReturnValue(trdResponse.getResponsePlainText());
            logDTO.setBusinessStatus(trdResponse.getMsghd_rspcode());
            logDTO.setBusinessNotes(trdResponse.getMsghd_rspmsg());
            logDTO.setParams(trdRequest.getRequestPlainText());
            logDTO.setStatus(0);

            // 交易成功 000000
            if ("000000".equals(trdResponse.getMsghd_rspcode())) {
                // ！！！ 在这里添加合作方处理逻辑！！！
                httpSuccess = true;
                System.out.println("[msghd_rspmsg]=[" + trdResponse.getMsghd_rspmsg() + "]"); // 返回信息
                System.out.println("[srl_ptnsrl]=[" + trdResponse.getSrl_ptnsrl() + "]"); // 合作方流水号
                System.out.println("[srl_platsrl]=[" + trdResponse.getSrl_platsrl() + "]"); // 平台流水号
                rechargeDTO.setZjBusinessId(trdResponse.getSrl_platsrl());
                // 支付方式： 2：网银 9：银联无卡支付
                String url = URLDecoder.decode(trdResponse.getUrl(), "UTF-8");
                rechargeDTO.setZjPayUrl(url);

                //添加记录
                this.insert(rechargeDTO);

//                if ("2".equals(billinfo_paytype) || "9".equals(billinfo_paytype)) {
//                    String url = URLDecoder.decode(trdResponse.getUrl(), "UTF-8");
//
//                    String strs[] = url.split("\\?", 2);
//
//                    String actionUrl = strs[0];
//                    String params[] = strs[1].split("\\&", 2);
//
//                    String kvl1[] = params[0].split("\\=", 2);
//                    String key1 = kvl1[0];
//                    String val1 = kvl1[1];
//
//                    String kvl2[] = params[1].split("\\=", 2);
//                    String key2 = kvl2[0];
//                    String val2 = kvl2[1];
//
//                } else if ("6".equals(billinfo_paytype)) {
//                    System.out.println("[url]=[" + trdResponse.getUrl() + "]"); // PayType=6时为二维码的CODE地址
//                    System.out.println("[imageurl]=[" + trdResponse.getImageurl() + "]"); // PayType=6时返回二维码图片地址
//                } else if ("5".equals(billinfo_paytype) && "2".equals(billinfo_kjsmsflg)) {
//                    System.out.println("[state]=[" + trdResponse.getState() + "]"); // PayType=5且KJSMSFlg=2时返回交易结果::1成功;2失败;3处理中
//                } else if ("8".equals(billinfo_paytype) || "A".equals(billinfo_paytype)) {
//                    System.out.println("[authcode]=[" + trdResponse.getAuthcode() + "]"); // PayType=8/A时返回授权码
//                } else if ("H".equals(billinfo_paytype)&&"8".equals(billinfo_secpaytype)) {
//                    String authCode =  trdResponse.getAuthcode();
//                    authCode = Base64.decode(authCode, "UTF-8");
//                    System.out.println("[authcode]=[" + authCode+ "]"); // PayType=6时返回二维码图片地址
//
//                }
            } else {
                // ！！！ 在这里添加合作方处理逻辑！！！
                msg = trdResponse.getMsghd_rspmsg();
            }


        } catch (Exception e) {
            e.printStackTrace();
            log.error("TrdT2031Request 网银充值 is error", e);
            logDTO.setStatus(1);
            logDTO.setReturnValue("TrdT2031Request 网银充值 500");
        }

        //添加日志
        logDTO.setId(ymlConfig.getPkId());
        httpLogService.insert(logDTO);
        if(!httpSuccess){
            return new Result(CodeEnum.FAIL_200018.getCode(), msg);
        }
        return new Result(rechargeDTO);
    }

    /**
     * 提现到银行卡
     * @param saveBO
     * @return
     */
    @Override
    public Result saveWithdraw(PayUserWithdrawBO saveBO) {
        if(saveBO.getUserId() == null || saveBO.getMoney() == null || saveBO.getMoney().doubleValue() <= 0){
            return new Result(CodeEnum.FAIL_100002);
        }
        PayUserDTO dto = payUserService.getPayUserDTO(saveBO.getUserId(), saveBO.getAccountType());
        if(dto == null){
            return new Result(CodeEnum.FAIL_200003);
        }

        //获取用余额
        if(dto.getNoWithdrawMoney() != null && dto.getNoWithdrawMoney().compareTo(BigDecimal.ZERO) > 0){
            Result<PayUserBalanceVO> balanceVOResult = payUserService.getUserBalance(saveBO.getUserId(), saveBO.getAccountType());
            if(!balanceVOResult.success()){
                return new Result(CodeEnum.FAIL_200003);
            }

            BigDecimal useMoney = balanceVOResult.getData().getUseMoney();
            if(BigDecimalUtils.sub(useMoney, dto.getNoWithdrawMoney()).compareTo(saveBO.getMoney()) < 0){
                return new Result(CodeEnum.FAIL_200028);
            }
        }


        //调用余额接口
        //添加请求日志
        PayHttpLogDTO logDTO = new PayHttpLogDTO();
        boolean httpSuccess = false;
        //添加记录
        PayUserRechargeDTO rechargeDTO = new PayUserRechargeDTO();
        Long id = ymlConfig.getPkId();
        rechargeDTO.setId(id);
        rechargeDTO.setUserId(saveBO.getUserId());
        rechargeDTO.setMoney(saveBO.getMoney());
        rechargeDTO.setType(1);
        rechargeDTO.setStatus(0);

        String msg = CodeEnum.FAIL_200019.getMsg();
        try {


            // 2. 实例化交易对象
            TrdT2022Request trdRequest = new TrdT2022Request();

            trdRequest.setMsghd_trdt(DateUtils.dateToStr(new Date(),DateUtils.DATE_FORMAT_DATESHORTDAY));/** 交易日期 */
            trdRequest.setSrl_ptnsrl(id.toString());/** 合作方交易流水号 */
            trdRequest.setCltacc_subno(dto.getZjMoneyNo());/** 资金账号 */
            trdRequest.setCltacc_cltnm(dto.getZjAccountName()); /** 户名 */

            trdRequest.setBkacc_accno(saveBO.getBankCard());/** 银行账号(卡号) */
            trdRequest.setBkacc_accnm(dto.getZjAccountName()); /** 开户名称 */
            BigDecimal money = saveBO.getMoney().setScale(2).multiply(BigDecimal.valueOf(100));
            trdRequest.setAmt_aclamt(money.longValue());/** 发生额(资金单位:分) */
//            trdRequest.setAmt_feeamt(amt_feeamt);/** 转账手续费 */
            /**
             * A00 正常出金 <br>
             * B01 解冻资金后，再出金
             */
            trdRequest.setTrsflag("A00");
            /**
             * 结算方式标示 <br>
             * AA=正常结算(默认) <br>
             * T0=T0代付出金 <br>
             * T1=T1代付出金
             */
            trdRequest.setBalflag("T1");
            trdRequest.setUsage("提现-"+id);/** 资金用途(附言) */
            trdRequest.setAmt_tamt(BigDecimalUtils.multiply(saveBO.getMoney(), 100).longValue());/** 总金额 = 发生额 + 转账手续费 */

            // 3. 报文处理
            trdRequest.process();
            System.out.println("请求报文[" + trdRequest.getRequestPlainText() + "]");
            System.out.println("签名原文[" + trdRequest.getRequestMessage() + "]");
            System.out.println("签名数据[" + trdRequest.getRequestSignature() + "]");
            logDTO.setParams(trdRequest.getRequestPlainText());
            logDTO.setWaterId(id);

            // 4. 与融资平台通信
            TrdMessenger trdMessenger = new TrdMessenger();
            // message
            String respMsg = trdMessenger.send(trdRequest);

            // 5. 处理交易结果
            TrdCommonResponse trdResponse = new TrdCommonResponse(respMsg);
            System.out.println("响应报文[" + trdResponse.getResponsePlainText() + "]");

            logDTO.setReturnValue(trdResponse.getResponsePlainText());
            logDTO.setBusinessStatus(trdResponse.getMsghd_rspcode());
            logDTO.setBusinessNotes(trdResponse.getMsghd_rspmsg());
            logDTO.setParams(trdRequest.getRequestPlainText());
            logDTO.setStatus(0);

            // 交易成功 000000
            if ("000000".equals(trdResponse.getMsghd_rspcode())) {
                // ！！！ 在这里添加合作方处理逻辑！！！
                httpSuccess = true;
                System.out.println("[msghd_rspmsg]=[" + trdResponse.getMsghd_rspmsg() + "]"); // 返回信息
                System.out.println("[srl_ptnsrl]=[" + trdResponse.getSrl_ptnsrl() + "]"); // 合作方流水号
                System.out.println("[srl_platsrl]=[" + trdResponse.getSrl_platsrl() + "]"); // 平台流水号
                rechargeDTO.setZjBusinessId(trdResponse.getSrl_platsrl());
                //添加记录
                this.insert(rechargeDTO);
            } else {
                // ！！！ 在这里添加合作方处理逻辑！！！
                msg = trdResponse.getMsghd_rspmsg();
            }

        } catch (Exception e) {
            e.printStackTrace();
            log.error("TrdT2022Request 提现 is error", e);
            logDTO.setStatus(1);
            logDTO.setReturnValue("TrdT2022Request 提现 500");
        }

        //添加日志
        logDTO.setId(ymlConfig.getPkId());
        httpLogService.insert(logDTO);
        if(!httpSuccess){
            return new Result(CodeEnum.FAIL_200019.getCode(), msg);
        }
        return new Result();
    }


    /**
     * 批量冻结金额
     * @param list
     * @return
     */
    @Override
    public Result<List<PayUserRechargeDTO>> saveFreezeMoney(List<PayUserMoneySaveBO> list) {
        return saveMoney(list, 0);
    }

    /**
     * 批量解冻金额
     * @param list
     * @return
     */
    @Override
    public Result<List<PayUserRechargeDTO>> saveUnfreezeMoney(List<PayUserMoneySaveBO> list) {
        return saveMoney(list, 1);
    }

    /**
     * 解冻/冻结余额
     * @param list
     * @param type 0冻结、1解冻
     * @return
     */
    @Override
    public Result<List<PayUserRechargeDTO>> saveMoney(List<PayUserMoneySaveBO> list, int type) {
        if(list == null || list.size() == 0){
            return new Result(CodeEnum.FAIL_200003);
        }
        //添加请求日志
        PayHttpLogDTO logDTO = new PayHttpLogDTO();
        boolean httpSuccess = false;
        List<PayUserRechargeDTO> rechargeDTOS = new ArrayList<>();
        int code = CodeEnum.FAIL_200020.getCode();
        String msg = CodeEnum.FAIL_200020.getMsg();
        if(type == 1){
            code = CodeEnum.FAIL_200021.getCode();
            msg = CodeEnum.FAIL_200021.getMsg();
        }
        try {

            List<FrzeInfo> frzeInfoList = new ArrayList<FrzeInfo>();
            // 2. 实例化交易对象
            TrdT3002Request trdRequest = new TrdT3002Request();
            trdRequest.setMsghd_trdt(DateUtils.dateToStr(new Date(),DateUtils.DATE_FORMAT_DATESHORTDAY));/** 交易日期 */

            // 批量支付数据
            for(PayUserMoneySaveBO saveBO : list){
                if(saveBO.getMoney() == null || saveBO.getMoney().doubleValue() <= 0){
                    return new Result(CodeEnum.FAIL_100002);
                }
                PayUserDTO dto = payUserService.getPayUserDTO(saveBO.getUserId());
                if(dto == null){
                    return new Result(CodeEnum.FAIL_200003);
                }

                FrzeInfo frzeInfo = new FrzeInfo();
                frzeInfo.setSubno(dto.getZjMoneyNo()); /** 资金账号 */
                frzeInfo.setCltnm(dto.getZjAccountName()); /** 户名 */
                Long id = ymlConfig.getPkId();
                frzeInfo.setPtnsrl(id.toString()); /** 合作方业务单号(唯一) */
                BigDecimal money = saveBO.getMoney().setScale(2).multiply(BigDecimal.valueOf(100));
                frzeInfo.setAclamt(money.longValue()); /** 发生额 */
                if(type == 1){
                    String usage = StrUtils.isEmpty(saveBO.getUsage()) ? "解冻" : saveBO.getUsage();
                    frzeInfo.setUsage(usage + "-"+id); /** 资金用途(附言) */
                    frzeInfo.setTrsflag("B00"); /*** 业务标示(冻结业务标示:A00冻结;B00解冻)*/
                } else {
                    String usage = StrUtils.isEmpty(saveBO.getUsage()) ? "冻结" : saveBO.getUsage();
                    frzeInfo.setUsage(usage + "-"+id); /** 资金用途(附言) */
                    frzeInfo.setTrsflag("A00"); /*** 业务标示(冻结业务标示:A00冻结;B00解冻)*/
                }


                frzeInfoList.add(frzeInfo);

                PayUserRechargeDTO rechargeDTO = new PayUserRechargeDTO();
                rechargeDTO.setId(id);
                rechargeDTO.setUserId(saveBO.getUserId());
                rechargeDTO.setMoney(saveBO.getMoney());
                rechargeDTO.setBusinessId(saveBO.getBusinessId());
                if(type == 1){
                    rechargeDTO.setType(4);
                } else {
                    rechargeDTO.setType(3);
                }
                rechargeDTO.setStatus(0);
                rechargeDTOS.add(rechargeDTO);
            }

            trdRequest.setFrzeInfoList(frzeInfoList);

            // 3. 报文处理
            trdRequest.process();
            System.out.println("请求报文[" + trdRequest.getRequestPlainText() + "]");
            System.out.println("签名原文[" + trdRequest.getRequestMessage() + "]");
            System.out.println("签名数据[" + trdRequest.getRequestSignature() + "]");
            logDTO.setParams(trdRequest.getRequestPlainText());

            // 4. 与融资平台通信
            TrdMessenger trdMessenger = new TrdMessenger();
            // message
            String respMsg = trdMessenger.send(trdRequest);

            // 5. 处理交易结果
            TrdT3002Response trdResponse = new TrdT3002Response(respMsg);
            System.out.println("响应报文[" + trdResponse.getResponsePlainText() + "]");
            logDTO.setReturnValue(trdResponse.getResponsePlainText());
            logDTO.setBusinessStatus(trdResponse.getMsghd_rspcode());
            logDTO.setBusinessNotes(trdResponse.getMsghd_rspmsg());
            logDTO.setParams(trdRequest.getRequestPlainText());
            logDTO.setStatus(0);

            // 交易成功 000000
            if ("000000".equals(trdResponse.getMsghd_rspcode())) {
                // ！！！ 在这里添加合作方处理逻辑！！！
                httpSuccess = true;
                System.out.println("[msghd_rspmsg]=[" + trdResponse.getMsghd_rspmsg() + "]"); // 返回信息
                System.out.println("[frzeRsutList.size]=[" + trdResponse.getFrzeRsutList().size() + "]"); // 支付数量
                List<FrzeRsut> frzeRsutList = trdResponse.getFrzeRsutList();
                for (FrzeRsut frzeRsut : frzeRsutList) {
                    System.out.println("[ptnsrl]=[" + frzeRsut.getPtnsrl() + "]"); // 合作方业务单号(唯一)
                    System.out.println("[platsrl]=[" + frzeRsut.getPlatsrl() + "]"); // 平台交易流水号
                    System.out.println("[frzesta]=[" + frzeRsut.getFrzesta() + "]"); // 交易结果(1成功；2失败)
                    System.out.println("[opion]=[" + frzeRsut.getOpion() + "]"); // 失败原因

                    for (PayUserRechargeDTO rechargeDTO : rechargeDTOS){
                        if(frzeRsut.getPtnsrl().equals(rechargeDTO.getId().toString())){
                            rechargeDTO.setZjBusinessId(frzeRsut.getPlatsrl());
                            if ("1".equals(frzeRsut.getFrzesta())){
                                rechargeDTO.setStatus(2);
                            } else {
                                rechargeDTO.setStatus(3);
                                rechargeDTO.setZjFailMsg(frzeRsut.getOpion());
                                httpSuccess = false;
                                msg = frzeRsut.getOpion();
                            }
                            break;
                        }
                    }
                }

                this.insertBatch(rechargeDTOS);
            } else {
                // ！！！ 在这里添加合作方处理逻辑！！！
                msg = trdResponse.getMsghd_rspmsg();
            }

        } catch (Exception e) {
            e.printStackTrace();
            log.error("TrdT3002Request is error", e);
            logDTO.setStatus(1);
            logDTO.setReturnValue("TrdT3002Request "+type+" 500");
        }

        //添加日志
        logDTO.setId(ymlConfig.getPkId());
        httpLogService.insert(logDTO);
        if(!httpSuccess){
            return new Result(CodeEnum.FAIL_200020.getCode(), msg);
        }
        return new Result(rechargeDTOS);
    }

    @Override
    public void saveMoneyLog(PayUserRechargeDTO rechargeDTO) {
        if(rechargeDTO == null){
            return;
        }

        //添加请求日志
        PayHttpLogDTO logDTO = new PayHttpLogDTO();
        try {


            // 2. 实例化交易对象
            TrdT2012Request trdRequest = new TrdT2012Request();
            trdRequest.setMsghd_trdt(DateUtils.dateToStr(new Date(),DateUtils.DATE_FORMAT_DATESHORTDAY));
            trdRequest.setOrgsrl(rechargeDTO.getId().toString());

            // 3. 报文处理
            trdRequest.process();
            System.out.println("请求报文[" + trdRequest.getRequestPlainText() + "]");
            System.out.println("签名原文[" + trdRequest.getRequestMessage() + "]");
            System.out.println("签名数据[" + trdRequest.getRequestSignature() + "]");

            // 4. 与融资平台通信
            TrdMessenger trdMessenger = new TrdMessenger();
            // message
            String respMsg = trdMessenger.send(trdRequest);

            // 5. 处理交易结果
            TrdT2012Response trdResponse = new TrdT2012Response(respMsg);
            System.out.println("响应报文[" + trdResponse.getResponsePlainText() + "]");

            // 交易成功 000000
            if ("000000".equals(trdResponse.getMsghd_rspcode())) {
                // ！！！ 在这里添加合作方处理逻辑！！！
//                System.out.println("[msghd_rspmsg]=[" + trdResponse.getMsghd_rspmsg() + "]"); // 返回信息
//                System.out.println("[srl_ptnsrl]=[" + trdResponse.getSrl_ptnsrl() + "]"); // 合作方流水号
//                System.out.println("[srl_platsrl]=[" + trdResponse.getSrl_platsrl() + "]"); // 平台流水号
//                System.out.println("[cltacc_subno]=[" + trdResponse.getCltacc_subno() + "]"); // 子账号
//                System.out.println("[cltacc_cltnm]=[" + trdResponse.getCltacc_cltnm() + "]"); // 户名
//                System.out.println("[amt_aclamt]=[" + trdResponse.getAmt_aclamt() + "]分"); // 发生额
//                System.out.println("[amt_aclamt]=[" + trdResponse.getAmt_feeamt() + "]分"); // 转账手续费
//                System.out.println("[amt_ccycd]=[" + trdResponse.getAmt_ccycd() + "]"); // 币种，默认“CNY”
//                System.out.println("[state]=[" + trdResponse.getState() + "]"); // 交易结果:1成功;2失败;3处理中
//                System.out.println("[resttime]=[" + trdResponse.getResttime() + "]"); // 交易成功/失败时间(渠道通知时间)-出金时指交易成功时间，不是到账时间-格式:YYYYMMDDHH24MISS
//                System.out.println("[opion]=[" + trdResponse.getOpion() + "]"); // 失败原因
//                System.out.println("[ubalsta]=[" + trdResponse.getUbalsta() + "]"); // 出金结算状态(查询出金结果时返回)0未结算;1已发送结算申请
//                System.out.println("[ubaltim]=[" + trdResponse.getUbaltim() + "]"); // 出金结算时间(查询出金结果时返回)-格式YYYYMMDDHH24MISS-UBalSta=1时指成功发送结算申请的时间
//                System.out.println("[usage]=[" + trdResponse.getUsage() + "]"); // 资金用途(附言)
//                System.out.println("[Merchantid]=[" + trdResponse.getMerchantid() + "]"); // 终端商户号

                // 业务标示
                // 入金业务时指：
                // A00 正常入金
                // B00 入金成功后，再冻结资金
                // 出金业务时指：
                // A00 正常出金
                // B01 解冻资金后，再出金
//                System.out.println("[trsflag]=[" + trdResponse.getTrsflag() + "]");
//                System.out.println("[fdate]=[" + trdResponse.getFdate() + "]"); // 原交易日期
//                System.out.println("[ftime]=[" + trdResponse.getFtime() + "]"); // 原交易时间
//                System.out.println("[spec1]=[" + trdResponse.getSpec1() + "]"); // 备用1
//                System.out.println("[spec2]=[" + trdResponse.getSpec2() + "]"); // 备用2
//                System.out.println("[dremark1]=[" + trdResponse.getDremark1() + "]"); // 合作方自定义备注1
//                System.out.println("[dremark2]=[" + trdResponse.getDremark2() + "]"); // 合作方自定义备注2
//                System.out.println("[dremark3]=[" + trdResponse.getDremark3() + "]"); // 合作方自定义备注3
//                System.out.println("[dremark4]=[" + trdResponse.getDremark4() + "]"); // 合作方自定义备注4
//                System.out.println("[dremark5]=[" + trdResponse.getDremark5() + "]"); // 合作方自定义备注5
//                System.out.println("[dremark6]=[" + trdResponse.getDremark6() + "]"); // 合作方自定义备注6

                if("1".equals(trdResponse.getState())){
                    rechargeDTO.setStatus(2);
//                    //回调缴保证金
//                    if("1".equals(rechargeDTO.getNotifyUrl())){
//                        try{
//                            ShopEarnestMoneyReturnBO bo = new ShopEarnestMoneyReturnBO();
//                            bo.setShopId(rechargeDTO.getUserId());
//                            bo.setMoney(rechargeDTO.getMoney());
//                            bo.setPaySerial(rechargeDTO.getBusinessId() + "");
//                            bo.setPayId(rechargeDTO.getId() + "");
//                            asyncService.notifyMargin(bo);
//                            rechargeDTO.setNotifyStatus(1);
//                        } catch (Exception e){
//                            e.printStackTrace();
//                            log.error("回调shopEarnestMoneyService.updatePaidReturn is error", e);
//                        }
//
//                    }
                } else if("2".equals(trdResponse.getState())){
                    rechargeDTO.setStatus(3);
                } else {
                    rechargeDTO.setStatus(1);
                }

                int revision = rechargeDTO.getRevision();
                Wrapper wrapper = new EntityWrapper();
                wrapper.eq("id", rechargeDTO.getId());
                wrapper.eq("revision", revision);
                rechargeDTO.setRevision(revision + 1);
                PayUserRechargeDTO newRechargeDTO = new PayUserRechargeDTO();
                newRechargeDTO.setStatus(rechargeDTO.getStatus());
                newRechargeDTO.setId(rechargeDTO.getId());
                newRechargeDTO.setRevision(revision + 1);
                this.update(newRechargeDTO, wrapper);

                asyncService.notifyMargin(newRechargeDTO);
            } else {
                // ！！！ 在这里添加合作方处理逻辑！！！
            }

        } catch (Exception e) {
            e.printStackTrace();
            log.error("TrdT2012Request 查询出入金状态 is error", e);
            logDTO.setStatus(1);
            logDTO.setReturnValue("TrdT2012Request 查询出入金状态 500");
        }
    }
}
